//
// Created by jsjxsy on 2022/8/12.
//
#include <stdio.h>
//1) 当相邻成员的类型相同时，如果它们的位宽之和小于类型的 sizeof 大小，
// 那么后面的成员紧邻前一个成员存储，直到不能容纳为止；
// 如果它们的位宽之和大于类型的 sizeof 大小，那么后面的成员将从新的存储单元开始，
// 其偏移量为类型大小的整数倍。
void test2() {
  struct bs {
    unsigned m: 6;
    unsigned n: 12;
    unsigned p: 4;
  };
  printf("%d\n", sizeof(struct bs));
}

void test3() {
  struct bs {
    unsigned m: 12;
    unsigned ch;//如果成员之间穿插着非位域成员，那么不会进行压缩。例如对于下面的 bs：
    unsigned p: 4;
  };
  printf("%d\n", sizeof(struct bs));
}

void test1() {
  struct bs {
    unsigned m;
    unsigned n: 4;//4bit (0-15)
    unsigned char ch: 6;//6bit (0-63)
  } a = {0xad, 0xE, '$'};
  //第一次输出
  printf("%#x, %#x, %c\n", a.m, a.n, a.ch);
  printf("bs size of %d\n", sizeof(struct bs));
  //更改值后再次输出
  a.m = 0xb8901c;
  a.n = 0x2d;
  a.ch = 'z';//122
  printf("%#x, %#x, %c\n", a.m, a.n, a.ch);
  printf("bs size of %d\n", sizeof(a));
}

int main(void) {
  //test1();
//  test2();
  test3();
  return (0);
}
